package com.rd.teacher.jichao.day09;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;

public class Test {

    public static void main(String[] args) {
        // 一般不用Object
        ArrayList arrayList = new ArrayList();
        arrayList.add("1");
//        arrayList.add(2);
//        arrayList.add(6L);
//
//        for (int i = 0; i < arrayList.size(); i++) {
//            String str = (String) arrayList.get(i);
//            System.out.println(str);
//        }

        System.out.println("--------");

        String[] strArr = new String[10];
        int[] intArr = new int[5];

        ArrayList<String> strList = new ArrayList<>();

        ArrayList<Integer> intList = new ArrayList<>();

        strList.add("2");
        strList.add("3");

        intList.add(1);

//        for (int i = 0; i < strList.size(); i++) {
//            String str = strList.get(i);
//            System.out.println(str);
//        }


        LinkedList<String> linkedList = new LinkedList<>();
        HashSet<String> set = new HashSet<>();

        // k String  v int
        HashMap<String, Integer> map = new HashMap<>();

        // 没有多维数组
        // 一维数组  可以让一维数组中的每个元素 又是一个数组
        ArrayList<Integer> list1 = new ArrayList();
        list1.add(1);
        list1.add(2);

        ArrayList<Integer> list2 = new ArrayList();
        list2.add(2);
        list2.add(3);
        list2.add(1);

        ArrayList<Integer> list3 = new ArrayList();
//        list3.add(3);
        list3.add(4);

        ArrayList<ArrayList<Integer>> lists = new ArrayList<>();
        lists.add(list1);
        lists.add(list2);
        lists.add(list3);

        // { {1,2} {2,3,1} {4}}

        //  lists.get(0)  -> list1   2   {1,2}
        //  lists.get(1)  -> list2   3   {2,3,1}
        //  lists.get(2)  -> list3   1   {4}
//        for (int i = 0; i < lists.size(); i++) {
//            ArrayList<Integer> eList = lists.get(i);
//
//            for (int j = 0; j < eList.size(); j++) {
//                Integer num = eList.get(j);
//                System.out.println(num);
//            }
//            System.out.println("-------");
//        }
//

//        GenericCls<String> genericCls = new GenericCls<>("test");
//        System.out.println(genericCls.getValue());
//
//        GenericCls<Integer> genericCls1 = new GenericCls<>(10);
//        System.out.println(genericCls1.getValue());
//
//        ArrayList<Integer> arrayList1 = new ArrayList<>();
//        GenericCls<ArrayList<Integer>> genericCls2 = new GenericCls<>(arrayList1);
//

//        String str = genericCls.genericMethod("abc");
////        System.out.println(str);
//
//        Integer num = genericCls.genericMethod(123);
//
//        String str1 = genericCls.genericMethod1("321");

        // ArrayList 既能存储整数 又能存储浮点数
        // 但不能存储其他的类型
        ArrayList arrayList1 = new ArrayList();
        ArrayList<Integer> arrayListInt = new ArrayList();
        arrayListInt.add(2);

        ArrayList<Double> arrayListDouble = new ArrayList();
        arrayListDouble.add(2.12);


        ArrayList<Number> arrayListNumber = new ArrayList<>();
        arrayListNumber.add(123);
        arrayListNumber.add(1.23);

        // ArrayList<Number> 和 ArrayList<Integer> ArrayList<Double>没有关系
        // 所以不能兼容
//        printList0(arrayList2);
//        printList0(arrayList3);

//        for (int i = 0; i < arrayList4.size(); i++) {
//            Number number = arrayList4.get(i);
//            System.out.println(number);
//        }

//        GenericTypeCls<Integer> typeCls = new GenericTypeCls(123);
//        System.out.println(typeCls.getValue());
//
//        GenericTypeCls<Number> typeCls1 = new GenericTypeCls<>(123);
//
//        GenericTypeCls<Double> typeCls2 = new GenericTypeCls<>(1.23);

//        GenericTypeCls<String>

//        printList(arrayListInt);
//        printList(arrayListNumber);
//        printList(arrayListDouble);
//
//        printListSuper(arrayListInt);
//        printListSuper(arrayListNumber);
//        printListSuper(arrayListDouble);

//        printList0(arrayList);

//        ArrayList<Object> list = new ArrayList<>();
//        printList0(list);
//
        printListNoGeneric(arrayListInt);
        printListNoGeneric(arrayListDouble);
        printListNoGeneric(arrayListNumber);

//        ArrayList<?> list111 = new ArrayList<>();
//        list111.add("111");
//        list111.add(null);
    }

    // 语法糖  使用方式  Object
    //
    public static void printListNoGeneric(ArrayList arrayList){
        for (int i = 0; i < arrayList.size(); i++) {
            System.out.println(arrayList.get(i));
        }
    }

    public static void printList0(ArrayList<?> arrayList){
        for (int i = 0; i < arrayList.size(); i++) {
            System.out.println(arrayList.get(i));
        }
    }

    // ? extends Number 是一种通配符  可以支持Number自身
    // 以及所有继承Number的子类
    public static void printList(ArrayList<? extends Number> arrayList){
        for (int i = 0; i < arrayList.size(); i++) {
            System.out.println(arrayList.get(i));
        }
    }

    // ? super Integer 是一种通配符  可以支持Integer自身  以及Integer的父类
    public static void printListSuper(ArrayList<? super Integer> arrayList){
        for (int i = 0; i < arrayList.size(); i++) {
            System.out.println(arrayList.get(i));
        }
    }
}
